# ==============================================================================
# 基础配置：指定 CMake 版本、项目信息
# ==============================================================================
# CMake 最低版本要求（需支持 C++17 和 Qt5 组件，3.16 是 Ubuntu 24.04 默认兼容版本）
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)

# 项目名称、版本、支持语言（仅 C++）
project(robot_control_system 
    VERSION 1.0.0 
    LANGUAGES CXX
)

# 输出项目信息（便于调试，确认配置生效）
message(STATUS "=============================================")
message(STATUS "Project: ${PROJECT_NAME} (v${PROJECT_VERSION})")
message(STATUS "Build Directory: ${CMAKE_BINARY_DIR}")
message(STATUS "Source Directory: ${PROJECT_SOURCE_DIR}")
message(STATUS "=============================================")


# ==============================================================================
# 编译选项：启用 C++17、配置 Debug/Release 模式
# ==============================================================================
# 强制启用 C++17 标准（支持 std::variant，解决 ControlParam 结构体问题）
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # 必须满足 C++17，否则报错
set(CMAKE_CXX_EXTENSIONS OFF)        # 禁用编译器扩展（保证跨平台兼容性）

# 配置编译优化与警告
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    # Debug 模式：启用调试信息、禁用优化、全开警告（便于调试代码）
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall -Wextra -Wshadow -Werror=return-type")
    message(STATUS "Build Type: Debug (Debug info enabled, no optimization)")
else()
    # Release 模式：启用 O2 优化、关闭冗余警告（提升运行效率）
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall -Wextra -DNDEBUG")
    message(STATUS "Build Type: Release (O2 optimization enabled)")
endif()


# ==============================================================================
# 依赖查找：Qt5 组件 + OpenSSL（核心依赖）
# ==============================================================================
# --------------------------
# 1. 查找 Qt5 依赖（必须包含项目所需组件）
# --------------------------
find_package(Qt5 REQUIRED COMPONENTS
    Core          # Qt 核心功能（信号槽、QVector3D、容器等）
    Gui           # 图形界面基础（若用 QVector3D/Qt 绘图）
    Widgets       # 窗口组件（若有 GUI 界面，如主窗口、按钮）
    Charts        # 2D 图表模块（如传感器数据曲线）
    DataVisualization  # 3D 可视化模块（如机器人轨迹、模型展示）
)

# 启用 Qt 自动处理工具（必备！否则 Qt 元对象系统、UI 文件、资源文件失效）
set(CMAKE_AUTOMOC ON)  # 自动处理 Q_OBJECT 宏（MOC 编译）
set(CMAKE_AUTORCC ON)  # 自动处理 .qrc 资源文件
set(CMAKE_AUTOUIC ON)  # 自动处理 .ui 界面文件（若用 Qt Designer）

# 打印 Qt 版本（确认依赖正确）
message(STATUS "Qt5 Version: ${Qt5_VERSION}")
message(STATUS "Qt5 Include Dir: ${Qt5_INCLUDE_DIRS}")

# --------------------------
# 2. 查找 OpenSSL 依赖（解决之前的链接错误）
# --------------------------
find_package(OpenSSL REQUIRED)  # 强制要求 OpenSSL，未找到则报错

# 打印 OpenSSL 信息（确认依赖正确）
if(OPENSSL_FOUND)
    message(STATUS "OpenSSL Version: ${OPENSSL_VERSION}")
    message(STATUS "OpenSSL Include Dir: ${OPENSSL_INCLUDE_DIR}")
    message(STATUS "OpenSSL Libraries: ${OPENSSL_LIBRARIES}")
else()
    # 若未找到，提示用户安装 libssl-dev
    message(FATAL_ERROR "OpenSSL not found! Please install it first: sudo apt-get install -y libssl-dev")
endif()


# ==============================================================================
# 项目结构配置：头文件路径 + 源文件列表
# ==============================================================================
# --------------------------
# 1. 头文件路径（告诉编译器去哪里找自定义头文件）
# --------------------------
include_directories(
    ${PROJECT_SOURCE_DIR}/include          # 全局公共头文件（如 control_command.h）
    ${PROJECT_SOURCE_DIR}/src/core         # 核心模块头文件（如 robot_state.h）
    ${PROJECT_SOURCE_DIR}/src/communication # 通信模块头文件（如 protocol.h）
    # 【可选】根据你的项目添加其他模块路径，例如：
    # ${PROJECT_SOURCE_DIR}/src/gui         # GUI 模块（如 main_window.h）
    # ${PROJECT_SOURCE_DIR}/src/driver      # 驱动模块（如 motor_driver.h）
    # ${PROJECT_SOURCE_DIR}/src/utils       # 工具模块（如 log.h）
)

# --------------------------
# 2. 源文件列表（所有 .cpp 文件，确保不遗漏！）
# --------------------------
set(SOURCES
    # 主函数（项目入口，必须包含！）
    ${PROJECT_SOURCE_DIR}/src/main.cpp

    # 核心模块源文件
    ${PROJECT_SOURCE_DIR}/src/core/robot_state.cpp

    # 通信模块源文件
    ${PROJECT_SOURCE_DIR}/src/communication/protocol.cpp
    ${PROJECT_SOURCE_DIR}/src/communication/secure_comm.cpp  # 安全通信模块（如加密）

    # 【可选】根据你的项目添加其他源文件，例如：
    # ${PROJECT_SOURCE_DIR}/src/gui/main_window.cpp  # GUI 主窗口
    # ${PROJECT_SOURCE_DIR}/src/driver/motor_driver.cpp # 电机驱动
    # ${PROJECT_SOURCE_DIR}/src/utils/log.cpp        # 日志工具
)

# --------------------------
# 3. 资源文件（【可选】若有 .qrc 资源文件，如图片、图标、UI 文件）
# --------------------------
# set(RESOURCES
#     ${PROJECT_SOURCE_DIR}/src/resources/resources.qrc  # 资源文件路径
# )

# --------------------------
# 4. UI 文件（【可选】若用 Qt Designer 设计 .ui 界面）
# --------------------------
# set(UIS
#     ${PROJECT_SOURCE_DIR}/src/gui/main_window.ui  # UI 文件路径
# )


# ==============================================================================
# 生成可执行文件 + 链接依赖
# ==============================================================================
# --------------------------
# 1. 生成可执行文件（名称为 robot_control，可自定义）
# --------------------------
add_executable(robot_control
    ${SOURCES}
    # ${RESOURCES}  # 【可选】若有资源文件，取消注释
    # ${UIS}        # 【可选】若有 UI 文件，取消注释
)

# --------------------------
# 2. 链接所有依赖库（Qt 组件 + OpenSSL）
# --------------------------
target_link_libraries(robot_control PRIVATE
    # Qt5 组件（必须与前面 find_package 的组件对应）
    Qt5::Core
    Qt5::Gui
    Qt5::Widgets
    Qt5::Charts
    Qt5::DataVisualization

    # OpenSSL 库（加密通信依赖）
    OpenSSL::SSL
    OpenSSL::Crypto

    # 【可选】若有其他第三方库（如 Boost、Eigen），添加在这里：
    # Boost::system
    # Eigen3::Eigen
)


# ==============================================================================
# 【可选】安装配置（make install 时生效，将程序安装到系统目录）
# ==============================================================================
install(TARGETS robot_control
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}  # 可执行文件安装路径（如 /usr/local/bin）
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}  # 动态库路径（若项目生成库）
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}  # 静态库路径（若项目生成库）
    COMPONENT runtime  # 安装组件（用于分组件安装）
)

# 【可选】安装资源文件（如配置文件、图标）
# install(FILES ${PROJECT_SOURCE_DIR}/config.ini
#     DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME}  # 配置文件路径（如 /etc/robot_control_system）
# )


# ==============================================================================
# 编译完成提示（友好提示用户下一步操作）
# ==============================================================================
message(STATUS "=============================================")
message(STATUS "CMake configuration completed successfully!")
message(STATUS "Next steps:")
message(STATUS "1. Compile: make -j$(nproc)  # 多线程编译（用满 CPU 核心）")
message(STATUS "2. Run: ./robot_control       # 运行程序")
message(STATUS "3. [Optional] Install: sudo make install")
message(STATUS "=============================================")